#include <cstdlib>
#include<iostream>
#include <iterator>
#include"Sock.hpp"
#include"protocol.hpp"
#include <unistd.h>

using namespace ns_protocol;

int main(int argc,const char* argv[])
{
    if(argc != 3){
        exit(-1);
    }
    uint16_t server_port=atoi(argv[1]);
    std::string server_ip=argv[2];
    Sock sock;
    int sockfd=sock.Socket();
    if(!sock.Connet(sockfd, server_port, server_ip))
    {
        exit(-1);
    }
    bool quit=false;
    std::string buffer;
    while(!quit)
    {
        Request req;
        std::cin>>req._x>>req._op>>req._y;
        std::string str=req.Serialize();
        str=EnCode(str);
        Send(sockfd, str);
        while(true)
        {
            bool res=Recv(sockfd, &buffer);
            if(!res){
                exit(-1);
            }
            Response resp;
            std::string package;
            package = DeCode(package);
            package = resp.Deserialize(package);
            std::string err;
            switch (resp._code)
            {
            case '1':
                err = "除0错误";
                break;
            default:
                break;
            }
            if(!err.empty())
                std::cerr<<err<<std::endl;
        }
    }
    close(sockfd);
    return 0;
}
// int main(int argc,const char* argv[])
// {
//     if(argc != 3){
//         exit(-1);
//     }
//     uint16_t server_port=atoi(argv[1]);
//     std::string server_ip=argv[2];
//     Sock sock;
//     int sockfd=sock.Socket();
//     if(!sock.Connet(sockfd, server_port, server_ip))
//     {
//         exit(-3);
//     }
//     bool quit=false;
//     std::string buffer;
//     while(!quit)
//     {
//         Request req;
//         //cin
//         std::string str=req.Serialize();
//         str = EnCode(str);
//         Send(sockfd, str);
//         while(true)
//         {
//             bool res=Recv(sockfd, &buffer);
//             if(!res){
//                 quit=true;
//                 break;
//             }
//             Response resp;
//             //这里还有一个去除头部的问题
//             std::string package = DeCode(buffer);
//             if(package.empty()){
//                 continue;
//             }
//             //因为这里需要分析数据，分析数据之前必须先反序列化
//             resp.Deserialize(package);
//             switch (resp._code)
//             {
//             default:
//                 break;
//             }
//         }
//     }
//     return 0;
// }
// int main(int argc,const char* argv[])
// {
//     if(argc != 3){
//         exit(-1);
//     }
//     uint16_t server_port=atoi(argv[1]);
//     std::string server_ip=argv[2];
//     Sock sock;
//     int sockfd=sock.Socket();
//     if(sock.Connet(sockfd, server_port, server_ip))
//     {
//         exit(-2);
//     }
//     bool quit=false;
//     std::string buffer;
//     while(!!quit)
//     {
//         Request req;
//         std::cin>>req._x>>req._op>>req._y;
//         std::string str=req.Serialize();
//         str=EnCode(str);
//         Send(sockfd, str);
//         while(true)
//         {
//             bool res=Recv(sockfd, &buffer);
//             if(!res){
//                 quit=true;
//                 break;
//             }
//             std::string package=DeCode(buffer);
//             if(package.empty()){
//                 continue;
//             }
//             Response resp;
//             //计算的过程本来应该是服务端解决的问题
//             resp.Deserialize(package);
//             std::string err;
//             switch (switch_on)
//             {
//             default:
//                 break;
//             }
//         }
//     }
//     close(sockfd);
//     return 0;
// }
// int main(int argc,const char* argv[])
// {
//     if(argc != 3){
//         exit(-1);
//     }
//     uint16_t server_port=atoi(argv[1]);
//     std::string server_ip=argv[2];
//     Sock sock;
//     int sockfd=sock.Socket();
//     //这里首先要和服务端进行连接
//     if(!sock.Connet(sockfd, server_port,server_ip))
//     {
//         exit(2);
//     }
//     bool quit=false;
//     std::string buffer;
//     while(!quit)
//     {
//         Request req;
//         std::cout<<"Please Enter#"<<std::endl;
//         std::cin>>req._x>>req._op>>req._y;
//         std::string s=req.Serialize();
//         s=EnCode(s);
//         Send(sockfd, s);
//         while(true)
//         {
//             bool res=Recv(sockfd, &buffer);
//             if(!res){
//                 quit=true;
//                 break;
//             }
//             std::string package=DeCode(buffer);
//             if(package.empty()){
//                 continue;
//             }
//             Response resp;
//             resp.Deserialize(package);
//             std::string err;
//             switch (resp._code) 
//             {
//             case '1':
//                 break;
//             }
//             if(err.empty())
//                 std::cerr<<err<<std::endl;
//         }
//     }
//     close(sockfd);
//     return 0;
// }
// int main(int argc,const char* argv[])
// {
//     if(argc != 3){
//         exit(-1);
//     }
//     //这里拿到来自于服务端的套接字
//     std::string server_ip=argv[1];
//     uint16_t server_port=atoi(argv[2]);
//     Sock sock;
//     int sockfd=sock.Socket();    
//     if(!sock.Connet(sockfd, server_port, server_ip))
//     {
//         exit(-2);
//     }
//     bool quit=false;
//     std::string buffer;
//     while(!quit)
//     {
//         Request req;
//         std::cin>>req._x>>req._y>>req._op;
//         std::string s=req.Serialize();
//         //拿到序列化的数据以后添加头部
//         s = EnCode(s);
//         Send(sockfd,s);
//         while(true)
//         {
//             bool res=Recv(sockfd, &buffer);
//             if(!res)
//             {
//                 quit=true;
//                 break;
//             }
//             std::string package=DeCode(buffer);
//             if(package.empty()){
//                 continue;
//             }
//             Response resp;
//             resp.Deserialize(package);
//             std::string err;
//             switch (resp._code)
//             {
//             default:
//                 break;
//             }
//             if(!err.empty()){
//                 std::cerr<<err<<std::endl;
//                 break;
//             }
//         }
//     }
//     close(sockfd);
//     return 0;
// }   
// int main(int argc,const char* argv[])
// {
//     if(argc != 3)
//     {
//         exit(-1);
//     }
//     std::string server_ip=argv[2];
//     uint16_t server_port=atoi(argv[1]);
//     Sock sock;
//     int sockfd=sock.Socket();
//     if(!sock.Connet(sockfd, server_port, server_ip))
//     {
//         std::cerr<<"Connect error"<<std::endl;
//         exit(2);
//     }
//     bool quit=false;
//     std::string buffer;
//     while(!quit)
//     {
//         Request req;
//         std::cout<<"Please Enter#"<<std::endl;
//         std::cin>>req._x>>req._op>>req._y;
//         std::string s=req.Serialize();
//         s=EnCode(s);
//         Send(sockfd, s);

//         while(true)
//         {
//             bool res=Recv(sockfd, &buffer);
//             if(!res)
//             {
//                 quit=true;
//                 break;
//             }
//             std::string package = DeCode(buffer);
//             if(package.empty()){
//                 continue;
//             }
//             Response resp;
//             resp.Deserialize(package);
//             std::string err;
//             switch (resp._code)
//             {
//             case '1':
//                 err = "除0错误";
//                 break;
//             case '2':
//                 err = "模0错误";
//                 break;
//             case '3':
//                 err = "非法操作";
//                 break;
//             default:
//                 std::cout<<resp._x<<resp._op<<resp._y<<std::endl;
//                 break;
//             }
//             if(!err.empty()){
//                 std::cerr<<err<<std::endl;
//                 break;
//             }
//         }
//     }
//     close(sockfd);
//     return 0;
// }